<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 变量声明的方法
    // 1. let   声明方式   可以有字母数字下划线 首字母不能是数字 不能使用关键字  推荐驼峰命名
    // let b,c,d //可以声明多个变量

    // 1.1  不允许重复声明  重复声明会报错
    // let a = 10l
    // let a = 100
    // var a = 10
    // var a = 100
    // console.log(a); //  var 会覆盖前面

    // 1.2  块级作用域   声明的变量 只在块级作用域生效 也就是{}里面
    // if (true) {
    //   // let lpl = 'theshy'
    //   var lpl = 'theshy'
    // }
    // console.log(lpl);

    // 1.3  不影响作用域链
    // function fn () {
    //   let a = '卢锡安'
    //   function fn1 (){
    //     console.log(a);
    //   }
    //   fn1()
    // }
    // fn()


    // 1.5  let 有暂时性死区 ，没有声明前置 （预解析） hosting
    // var a = 10;
    // let a = 10;
    // console.log(a);

    // 1.6  let 不会挂载在window上 ；
    // var a = 10;
    // console.log(window.a);
    // let a = 20;
    // console.log(window.a); // undefined


    // 2.声明常量 const
    // 常量:  Math.PI

    // 特性:
    // 2.1 声明的简单数据类型 不能被更改
    // const a = 10
    // a = 20 // 会直接报错
    // let a = 10
    // a = 20  // let可以更改

    // 2.2 不能挂载到window
    // const a = 10
    // console.log(window.a); // undefined

    // 2.3 复杂数据类型
    // const obj = {
    //   name: 'theshy',
    //   age: 10
    // }

    // 重新赋值的方式不可更改
    // obj = {name:"李四"}; // 报错
    // 可以通过追加属性的方式修改对象
    // obj.name = "rookie";
    // console.log(obj);


    // 想要复杂数据类型不被更改   // 冻结对象，一旦冻结 ，对象就不能被更改   Object.freeze(obj);
    const obj = {
      name: "张三",
      age: 20,
      obj1: {
        myname: "王五"
      }
    }

    //  Object.freeze(obj); 只能保证一层的数据不被更改
    //  封装函数  利用递归 让每层的数据都不被更改
    function deepFreeze (obj) {
      for (let key in obj) {
        if (typeof obj[key] === "object") {
          deepFreeze(obj[key])
        } else {
          Object.freeze(obj);
        }
      }
    }
    deepFreeze(obj);

    obj.obj1.myname = "李四";
    console.log(obj);


  </script>
</body>

</html>